﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QLTTAN.DAL
{
    class ConnectionData
    {
         SqlConnection con = new SqlConnection();


        /// <summary>
        /// Khởi tạo biến ConnectionData và kết nối với CSDL.
        /// </summary>
         public ConnectionData()
        {
            try 
	        {
                // Lấy ConnectionString từ file appconfig.
                con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectString"].ConnectionString;
		        if(con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
	        }
	        catch (Exception)
	        {
                throw;
	        }
        }

        /// <summary>
        /// Đóng kết nối CSDL.
        /// </summary>
        public void Close()
        {
            con.Close();
            con.Dispose();
        }

        /// <summary>
        /// Lấy lên 1 bảng dữ liệu.
        /// </summary>
        /// <param name="sql">tên của procedure</param>
        /// <returns></returns>
        public DataTable GetData(string sql)
        {
            SqlCommand command = new SqlCommand(sql, con);
            command.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            DataTable table = new DataTable();
            try 
	        {
                adapter.Fill(table);
                adapter.Dispose();
                command.Dispose();
                table.Dispose();
                return table;
	        }
	        catch (Exception)
	        {
		        throw;
	        }
        }

        /// <summary>
        /// Lấy lên 1 bảng dữ liệu.
        /// </summary>
        /// <param name="sql">tên của procedure</param>
        /// <param name="name">tên của các tham số truyền vào</param>
        /// <param name="value">giá trị của các tham số truyền vào</param>
        /// <param name="Nparameter">số lượng của các tham số truyền vào</param>
        /// <returns></returns>
        public DataTable GetData(string sql, string[] name, object[] value, int Nparameter)
        {
            SqlCommand command = new SqlCommand(sql, con);
            command.CommandType = CommandType.StoredProcedure;
            for (int i = 0; i < Nparameter; i++)
            {
                command.Parameters.AddWithValue(name[i], value[i]);
            }
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            DataTable table = new DataTable();
            adapter.Fill(table);
            adapter.Dispose();
            command.Dispose();
            table.Dispose();
            return table;
        }

        /// <summary>
        /// Update bảng trong CSDL.
        /// Bao gồm delete và update bảng.
        /// </summary>
        /// <param name="sql">tên của procedure</param>
        /// <returns></returns>
        public int UpdateData(string sql)
        {
            SqlCommand command = new SqlCommand(sql, con);
            command.CommandType = CommandType.StoredProcedure;
            command.Dispose();
            return command.ExecuteNonQuery();
        }

        /// <summary>
        /// Update bảng trong CSDL.
        /// Bao gồm delete và update bảng.
        /// </summary>
        /// <param name="sql">tên của procedure</param>
        /// <param name="name">tên của các tham số truyền vào</param>
        /// <param name="value">giá trị của các tham số truyền vào</param>
        /// <param name="Nparameter">số lượng của các tham số truyền vào</param>
        /// <returns></returns>
        public int UpdateData(string sql, string[] name, object[] value, int Nparameter)
        {
            SqlCommand command = new SqlCommand(sql, con);
            command.CommandType = CommandType.StoredProcedure;
            for (int i = 0; i < Nparameter; i++)
            {
                command.Parameters.AddWithValue(name[i], value[i]);
            }
            command.Dispose();
            return command.ExecuteNonQuery();
        }
    }
}
